*/
-#include "defs.h"
-#include <QMap>
-#include <cmath>
-#include <cstdio>
+#include "humminbird.h"
+
+#include <QMap> // for QMap
+#include <Qt> // for CaseInsensitive
+
+#include <cmath> // for atan, tan, M_PI, log, sinh
+#include <cstdio> // for snprintf, SEEK_SET
+#include <cstring> // for strncpy, memcpy, memset
+
+#include "defs.h" // for Waypoint, be_read32, be_read16, be_write32, fatal, xfree, be_write16, route_head, si_round, xcalloc, track_add_wpt, xstrndup, mkshort, mkshort_del_handle, mkshort_new_handle, setshort_badchars, setshort_defname, setshort_length, setshort_mustuniq, setshort_...
+#include "src/core/datetime.h" // for DateTime
+
#define MYNAME "humminbird"
/* The hwr data format is records-based, and the records are 36 bytes long. */
-struct humminbird_waypt_t {
+struct HumminbirdBase::humminbird_waypt_t {
/* O.K.: the file can also contain routes with a different magic. */
/* uint32_t signature; */ /* Just for error checking(?) */
uint16_t num; /* Always ascending in the file. */
char name[WPT_NAME_LEN];
};
-struct humminbird_rte_t {
+struct HumminbirdBase::humminbird_rte_t {
/* O.K.: the file can contain also routes with a different magic. */
/* uint32_t signature; */ /* Just for error checking(?) */
uint16_t num;
uint16_t points[MAX_RTE_POINTS];
};
-struct humminbird_trk_header_t { /* 68 bytes, incl signature */
+struct HumminbirdBase::humminbird_trk_header_t { /* 68 bytes, incl signature */
/* uint32_t signature; */
uint16_t trk_num;
uint16_t zero;
};
-struct humminbird_trk_point_t {
+struct HumminbirdBase::humminbird_trk_point_t {
int16_t deltaeast;
int16_t deltanorth;
uint16_t depth; /* in centimeters */
};
-struct humminbird_trk_header_old_t { /* 16 bytes, incl signature */
+struct HumminbirdBase::humminbird_trk_header_old_t { /* 16 bytes, incl signature */
/* uint32_t signature; */
uint16_t trk_num;
uint16_t zero;
};
-struct humminbird_trk_point_old_t {
+struct HumminbirdBase::humminbird_trk_point_old_t {
int16_t deltaeast;
int16_t deltanorth;
};
-struct group_header_t {
+struct HumminbirdBase::group_header_t {
uint8_t status;
uint8_t icon;
uint16_t depth;
char name[WPT_NAME_LEN];
};
-struct group_body_t {
+struct HumminbirdBase::group_body_t {
uint8_t status;
uint8_t icon;
uint16_t next_idx;
};
-static const char* humminbird_icons[] = {
- "Normal", /* 0 */
- "House", /* 1 */
- "Red cross", /* 2 */
- "Fish", /* 3 */
- "Duck", /* 4 */
- "Anchor", /* 5 */
- "Buoy", /* 6 */
- "Airport", /* 7 */
- "Camping", /* 8 */
- "Danger", /* 9 */
- "Fuel", /* 10 */
- "Rock", /* 11 */
- "Weed", /* 12 */
- "Wreck", /* 13 */
- "Phone", /* 14 */
- "Coffee", /* 15 */
- "Beer", /* 16 */
- "Mooring", /* 17 */
- "Pier", /* 18 */
- "Slip", /* 19 */
- "Ramp", /* 20 */
- "Circle", /* 21 */
- "Diamond", /* 22 */
- "Flag", /* 23 */
- "Pattern", /* 24 */
- "Shower", /* 25 */
- "Water tap", /* 26 */
- "Tree", /* 27 */
- "Recording", /* 28 */
- "Snapshot" /* 29 */
-};
-
-static gbfile* fin_;
-static gbfile* fout_;
-static int waypoint_num;
-static short_handle wptname_sh, rtename_sh, trkname_sh;
-static humminbird_rte_t* humrte;
-static int rte_num_;
-static QMap<QString, Waypoint*> map;
-
-static
-QVector<arglist_t> humminbird_args = {
-};
-
/* Takes a latitude in degrees,
* returns a latitude in degrees. */
-static double
-geodetic_to_geocentric_hwr(const double gd_lat)
+double
+HumminbirdBase::geodetic_to_geocentric_hwr(const double gd_lat)
{
- const double cos_ae = 0.9966349016452;
- const double cos2_ae = cos_ae * cos_ae;
+ constexpr double cos_ae = 0.9966349016452;
+ constexpr double cos2_ae = cos_ae * cos_ae;
const double gdr = gd_lat *M_PI / 180.0;
return atan(cos2_ae * tan(gdr)) * 180.0/M_PI;
/* Takes a latitude in degrees,
* returns a latitude in degrees. */
-static double
-geocentric_to_geodetic_hwr(const double gc_lat)
+double
+HumminbirdBase::geocentric_to_geodetic_hwr(const double gc_lat)
{
- const double cos_ae = 0.9966349016452;
- const double cos2_ae = cos_ae * cos_ae;
+ constexpr double cos_ae = 0.9966349016452;
+ constexpr double cos2_ae = cos_ae * cos_ae;
const double gcr = gc_lat *M_PI / 180.0;
return atan(tan(gcr)/cos2_ae) * 180.0/M_PI;
}
/* Takes a projected "north" value, returns latitude in degrees. */
-static double
-gudermannian_i1924(const double x)
+double
+HumminbirdBase::gudermannian_i1924(const double x)
{
const double norm_x = x/i1924_equ_axis;
}
/* Takes latitude in degrees, returns projected "north" value. */
-static double
-inverse_gudermannian_i1924(const double x)
+double
+HumminbirdBase::inverse_gudermannian_i1924(const double x)
{
const double x_r = x/180.0 * M_PI;
const double guder = log(tan(M_PI/4.0 + x_r/2.0));
* %%% global callbacks called by gpsbabel main process %%% *
*******************************************************************************/
-static void
-humminbird_rd_init(const QString& fname)
+void
+HumminbirdBase::humminbird_rd_init(const QString& fname)
{
fin_ = gbfopen_be(fname, "rb", MYNAME);
}
-static void
-humminbird_rd_deinit()
+void
+HumminbirdBase::humminbird_rd_deinit() const
{
gbfclose(fin_);
}
-static void
-humminbird_read_wpt(gbfile* fin)
+void
+HumminbirdBase::humminbird_read_wpt(gbfile* fin)
{
humminbird_waypt_t w;
map[buff] = wpt;
}
-static void
-humminbird_read_route(gbfile* fin)
+void
+HumminbirdBase::humminbird_read_route(gbfile* fin) const
{
humminbird_rte_t hrte;
}
}
-static void
-humminbird_read_track(gbfile* fin)
+void
+HumminbirdBase::humminbird_read_track(gbfile* fin)
{
humminbird_trk_header_t th;
xfree(points);
}
-static void
-humminbird_read_track_old(gbfile* fin)
+void
+HumminbirdBase::humminbird_read_track_old(gbfile* fin)
{
humminbird_trk_header_old_t th;
- const int file_len = 8048;
+ constexpr int file_len = 8048;
char namebuf[TRK_NAME_LEN];
xfree(points);
}
-static void
-humminbird_read()
+void
+HumminbirdBase::humminbird_read()
{
while (! gbfeof(fin_)) {
uint32_t signature = gbfgetuint32(fin_);
/************************************************************************************************/
-static void
-humminbird_wr_init(const QString& fname)
+void
+HumminbirdBase::humminbird_wr_init(const QString& fname)
{
fout_ = gbfopen_be(fname, "wb", MYNAME);
rte_num_ = 0;
}
-static void
-humminbird_wr_deinit()
+void
+HumminbirdBase::humminbird_wr_deinit()
{
mkshort_del_handle(&wptname_sh);
mkshort_del_handle(&rtename_sh);
gbfclose(fout_);
}
-static void
-humminbird_write_waypoint(const Waypoint* wpt)
+void
+HumminbirdFormat::humminbird_write_waypoint(const Waypoint* wpt)
{
humminbird_waypt_t hum;
int num_icons = sizeof(humminbird_icons) / sizeof(humminbird_icons[0]);
gbfwrite(&hum, sizeof(hum), 1, fout_);
}
-static humminbird_trk_header_t* trk_head;
-static humminbird_trk_point_t* trk_points;
-static int32_t last_east;
-static int32_t last_north;
-static uint32_t last_time;
-
-
-static void
-humminbird_track_head(const route_head* trk)
+void
+HumminbirdHTFormat::humminbird_track_head(const route_head* trk)
{
int max_points = (131080 - sizeof(uint32_t)- sizeof(humminbird_trk_header_t)) / sizeof(humminbird_trk_point_t);
}
}
-static void
-humminbird_track_tail(const route_head*)
+void
+HumminbirdHTFormat::humminbird_track_tail(const route_head* /*unused*/)
{
int max_points = (131080 - sizeof(uint32_t)- sizeof(humminbird_trk_header_t)) / sizeof(humminbird_trk_point_t);
trk_points = nullptr;
}
-static void
-humminbird_track_cb(const Waypoint* wpt)
+void
+HumminbirdHTFormat::humminbird_track_cb(const Waypoint* wpt)
{
if (trk_head == nullptr) {
return;
}
-static void
-humminbird_track_write()
+void
+HumminbirdHTFormat::write()
{
-
- track_disp_all(humminbird_track_head, humminbird_track_tail, humminbird_track_cb);
+ auto humminbird_track_head_lambda = [this](const route_head* rte)->void {
+ humminbird_track_head(rte);
+ };
+ auto humminbird_track_tail_lambda = [this](const route_head* rte)->void {
+ humminbird_track_tail(rte);
+ };
+ auto humminbird_track_cb_lambda = [this](const Waypoint* waypointp)->void {
+ humminbird_track_cb(waypointp);
+ };
+ track_disp_all(humminbird_track_head_lambda, humminbird_track_tail_lambda, humminbird_track_cb_lambda);
}
-static void
-humminbird_rte_head(const route_head* rte)
+void
+HumminbirdFormat::humminbird_rte_head(const route_head* rte)
{
humrte = nullptr;
if (rte->rte_waypt_ct() > 0) {
}
}
-static void
-humminbird_rte_tail(const route_head* rte)
+void
+HumminbirdFormat::humminbird_rte_tail(const route_head* rte)
{
if (humrte == nullptr) {
return;
humrte = nullptr;
}
-static void
-humminbird_write_rtept(const Waypoint* wpt)
+void
+HumminbirdFormat::humminbird_write_rtept(const Waypoint* wpt) const
{
if (humrte == nullptr) {
return;
}
}
-static void
-humminbird_write_waypoint_wrapper(const Waypoint* wpt)
+void
+HumminbirdFormat::humminbird_write_waypoint_wrapper(const Waypoint* wpt)
{
char* key;
Waypoint* tmpwpt;
xfree(key);
}
-static void
-humminbird_write()
+void
+HumminbirdFormat::write()
{
- waypt_disp_all(humminbird_write_waypoint_wrapper);
- route_disp_all(nullptr, nullptr, humminbird_write_waypoint_wrapper);
- route_disp_all(humminbird_rte_head, humminbird_rte_tail, humminbird_write_rtept);
+ auto humminbird_write_waypoint_wrapper_lambda = [this](const Waypoint* waypointp)->void {
+ humminbird_write_waypoint_wrapper(waypointp);
+ };
+ waypt_disp_all(humminbird_write_waypoint_wrapper_lambda);
+ route_disp_all(nullptr, nullptr, humminbird_write_waypoint_wrapper_lambda);
+
+ auto humminbird_rte_head_lambda = [this](const route_head* rte)->void {
+ humminbird_rte_head(rte);
+ };
+ auto humminbird_rte_tail_lambda = [this](const route_head* rte)->void {
+ humminbird_rte_tail(rte);
+ };
+ auto humminbird_write_rtept_lambda = [this](const Waypoint* waypointp)->void {
+ humminbird_write_rtept(waypointp);
+ };
+ route_disp_all(humminbird_rte_head_lambda, humminbird_rte_tail_lambda, humminbird_write_rtept_lambda);
}
-
-/**************************************************************************/
-
-ff_vecs_t humminbird_vecs = {
- ff_type_file,
- {
- (ff_cap)(ff_cap_read | ff_cap_write) /* waypoints */,
- ff_cap_read /* tracks */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* routes */
- },
- humminbird_rd_init,
- humminbird_wr_init,
- humminbird_rd_deinit,
- humminbird_wr_deinit,
- humminbird_read,
- humminbird_write,
- nullptr, // humminbird_exit,
- &humminbird_args,
- CET_CHARSET_ASCII, 1 /* ascii is the expected character set */
- /* currently fixed !!! */
- , NULL_POS_OPS,
- nullptr
-};
-
-/**************************************************************************/
-
-/**************************************************************************/
-
-ff_vecs_t humminbird_ht_vecs = {
- ff_type_file,
- {
- ff_cap_read /* waypoints */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
- ff_cap_read /* routes */
- },
- humminbird_rd_init,
- humminbird_wr_init,
- humminbird_rd_deinit,
- humminbird_wr_deinit,
- humminbird_read,
- humminbird_track_write,
- nullptr, // humminbird_exit,
- &humminbird_args,
- CET_CHARSET_ASCII, 1 /* ascii is the expected character set */
- /* currently fixed !!! */
- , NULL_POS_OPS,
- nullptr
-};
-
-/**************************************************************************/
--- /dev/null
+/*
+ Copyright (C) 2008 Björn Augustsson, oggust@gmail.com
+ Copyright (C) 2008 Olaf Klein, o.b.klein@gpsbabel.org
+ Copyright (C) 2005-2013 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+#ifndef HUMMINBIRD_H_INCLUDED_
+#define HUMMINBIRD_H_INCLUDED_
+
+#include <QMap> // for QMap
+#include <QString> // for QString
+#include <QVector> // for QVector
+
+#include <cstdint> // for int32_t, uint32_t
+
+#include "defs.h" // for ff_cap, arglist_t, ff_cap_read, Waypoint, route_head, ff_cap_write, short_handle, CET_CHARSET_ASCII, ff_type, ff_type_file
+#include "format.h" // for Format
+#include "gbfile.h" // for gbfile
+
+
+class HumminbirdBase
+{
+protected:
+ /* Types */
+
+ struct humminbird_waypt_t;
+ struct humminbird_rte_t;
+ struct humminbird_trk_header_t;
+ struct humminbird_trk_point_t;
+ struct humminbird_trk_header_old_t;
+ struct humminbird_trk_point_old_t;
+ struct group_header_t;
+ struct group_body_t;
+
+ /* Constants */
+
+ static constexpr const char* humminbird_icons[] = {
+ "Normal", /* 0 */
+ "House", /* 1 */
+ "Red cross", /* 2 */
+ "Fish", /* 3 */
+ "Duck", /* 4 */
+ "Anchor", /* 5 */
+ "Buoy", /* 6 */
+ "Airport", /* 7 */
+ "Camping", /* 8 */
+ "Danger", /* 9 */
+ "Fuel", /* 10 */
+ "Rock", /* 11 */
+ "Weed", /* 12 */
+ "Wreck", /* 13 */
+ "Phone", /* 14 */
+ "Coffee", /* 15 */
+ "Beer", /* 16 */
+ "Mooring", /* 17 */
+ "Pier", /* 18 */
+ "Slip", /* 19 */
+ "Ramp", /* 20 */
+ "Circle", /* 21 */
+ "Diamond", /* 22 */
+ "Flag", /* 23 */
+ "Pattern", /* 24 */
+ "Shower", /* 25 */
+ "Water tap", /* 26 */
+ "Tree", /* 27 */
+ "Recording", /* 28 */
+ "Snapshot" /* 29 */
+ };
+
+ /* Member Functions */
+
+ static double geodetic_to_geocentric_hwr(double gd_lat);
+ static double geocentric_to_geodetic_hwr(double gc_lat);
+ static double gudermannian_i1924(double x);
+ static double inverse_gudermannian_i1924(double x);
+ void humminbird_rd_init(const QString& fname);
+ void humminbird_rd_deinit() const;
+ void humminbird_read_wpt(gbfile* fin);
+ void humminbird_read_route(gbfile* fin) const;
+ static void humminbird_read_track(gbfile* fin);
+ static void humminbird_read_track_old(gbfile* fin);
+ void humminbird_read();
+ void humminbird_wr_init(const QString& fname);
+ void humminbird_wr_deinit();
+
+ /* Data Members */
+
+ gbfile* fin_{};
+ gbfile* fout_{};
+ int waypoint_num{};
+ short_handle wptname_sh{}, rtename_sh{}, trkname_sh{};
+ humminbird_rte_t* humrte{};
+ int rte_num_{};
+ QMap<QString, Waypoint*> map;
+
+ humminbird_trk_header_t* trk_head{};
+ humminbird_trk_point_t* trk_points{};
+ int32_t last_east{};
+ int32_t last_north{};
+ uint32_t last_time{};
+};
+
+class HumminbirdFormat : public Format, private HumminbirdBase
+{
+public:
+ QVector<arglist_t>* get_args() override
+ {
+ return &humminbird_args;
+ }
+
+ ff_type get_type() const override
+ {
+ return ff_type_file;
+ }
+
+ QVector<ff_cap> get_cap() const override
+ {
+ return {
+ (ff_cap)(ff_cap_read | ff_cap_write) /* waypoints */,
+ ff_cap_read /* tracks */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* routes */
+ };
+ }
+
+ QString get_encode() const override
+ {
+ return CET_CHARSET_ASCII;
+ }
+
+ int get_fixed_encode() const override
+ {
+ return 1;
+ }
+
+ void rd_init(const QString& fname) override {humminbird_rd_init(fname);}
+ void read() override {humminbird_read();}
+ void rd_deinit() override {humminbird_rd_deinit();}
+ void wr_init(const QString& fname) override {humminbird_wr_init(fname);}
+ void write() override;
+ void wr_deinit() override {humminbird_wr_deinit();}
+
+private:
+ /* Member Functions */
+
+ void humminbird_rte_head(const route_head* rte);
+ void humminbird_rte_tail(const route_head* rte);
+ void humminbird_write_rtept(const Waypoint* wpt) const;
+ void humminbird_write_waypoint(const Waypoint* wpt);
+ void humminbird_write_waypoint_wrapper(const Waypoint* wpt);
+
+ /* Data Members */
+
+ QVector<arglist_t> humminbird_args = {
+ };
+};
+
+class HumminbirdHTFormat : public Format, private HumminbirdBase
+{
+public:
+ QVector<arglist_t>* get_args() override
+ {
+ return &humminbirdht_args;
+ }
+
+ ff_type get_type() const override
+ {
+ return ff_type_file;
+ }
+
+ QVector<ff_cap> get_cap() const override
+ {
+ return {
+ ff_cap_read /* waypoints */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
+ ff_cap_read /* routes */
+ };
+ }
+
+ QString get_encode() const override
+ {
+ return CET_CHARSET_ASCII;
+ }
+
+ int get_fixed_encode() const override
+ {
+ return 1;
+ }
+
+ void rd_init(const QString& fname) override {humminbird_rd_init(fname);}
+ void read() override {humminbird_read();}
+ void rd_deinit() override {humminbird_rd_deinit();}
+ void wr_init(const QString& fname) override {humminbird_wr_init(fname);}
+ void write() override;
+ void wr_deinit() override {humminbird_wr_deinit();}
+
+private:
+ /* Member Functions */
+
+ void humminbird_track_head(const route_head* trk);
+ void humminbird_track_tail(const route_head* unused);
+ void humminbird_track_cb(const Waypoint* wpt);
+
+ /* Data Members */
+
+ QVector<arglist_t> humminbirdht_args = {
+ };
+};
+
+#endif // HUMMINBIRD_H_INCLUDED_